Перейти к основному содержимому

5.05. Управление ресурсами и производительность

Разработчику Архитектору

Управление ресурсами и производительность

Управление неуправляемыми ресурсами

Что такое ресурс
Управляемые и неуправляемые ресурсы
Что такое управление ресурсами

Интерфейс IDisposable
Метод Dispose()
Паттерн Dispose

IDisposable — это интерфейс в C#, который указывает, что объект содержит неуправляемые ресурсы (например, файловые дескрипторы, соединения с БД, HTTP-сокеты), требующие явного освобождения после использования. Если этого не сделать, возможны утечки памяти и другие проблемы.
Управляемые ресурсы — объекты, за которые отвечает CLR (Common Language Runtime). Сборщик мусора (GC) автоматически освобождает их, когда они становятся недостижимыми. Пример: обычные объекты классов (string, List<T>).
Неуправляемые ресурсы — ресурсы вне контроля CLR (файлы, сетевые соединения, дескрипторы окон). Их нужно освобождать вручную. Пример: FileStream, SqlConnection, HttpClient.
Интерфейс IDisposable предоставляет метод Dispose(), который освобождает неуправляемые ресурсы, закрывает соединения, отменяет подписки на события.
Финализатор (Finalize)— это метод, который GC вызывает перед удалением объекта, если Dispose() не был вызван. Но он ненадёжен, так как GC запускается не сразу.
Рекомендуемый подход — шаблон с двумя методами:
Dispose() — для явного вызова.
Dispose(bool disposing) — для финализатора и явного освобождения.

Реализуйте IDisposable, если ваш класс:

Содержит неуправляемые ресурсы (файлы, сокеты, дескрипторы).
Содержит поля, реализующие IDisposable (Stream, DbContext).
Подписывается на события (чтобы избежать утечек памяти).

Конструкция using

using не только пространства имен
Конструкция using
using как оператор: автоматический вызов Dispose
using с блоком и без (C# 8+)

Слабые ссылки (WeakReference)

Слабые ссылки (WeakReference)
Для чего: кэши, избежание утечек памяти
WeakReference<T>